


function ajax(options) { // {url, data, async = true, dataType = "text", success}
    let { type = "get", url, data, async = true, dataType = "text", success, error } = options;
    try { // 捕获同步任务
        var xhr = new XMLHttpRequest();

        if (typeof data == "object") {  // 传入的数据是对象类型(条件不准确->后期补充)

            var list = [];
            for (var key in data) {
                var val = data[key];
                list.push(key + "=" + val)
            }
            data = list.join("&");
        }

        if (type.toLowerCase() == "get") { // GET get Get
            xhr.open("get", data ? url + "?" + data : url, async);
            xhr.send();
        } else if (type.toLowerCase() == "post") { // POST post Post
            xhr.open("post", url, async);

            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.send(data);
        }


        xhr.onreadystatechange = function () {
            try {  // xhr.readyState改变后  => onreadystatechange事件中的错误
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = xhr.responseText;

                    // 数据处理
                    if (dataType == "json") {
                        result = JSON.parse(result);
                    }
                    // console.log(result);

                    // 拿到数据之后的可能操作
                    // 列表数据 =>  动态生成(成绩表 商品列表)
                    // 数据增删改  => 增删改成功/失败


                    if (success) { //  在请求成功之后调用回调函数
                        success(result);  // 回调函数调用过程中出入实际参数(请求的结果)
                    }

                }
            } catch (err) {
                // // 是否存在回调函数error
                if (error) {   // 存在
                    error(err);  // 调用回调函数error,传出错误
                } else {  // 否则
                    throw err;  // 直接抛出错误
                }
            }
        }
    } catch (err) {

        // // 是否存在回调函数error
        if (error) {   // 存在
            error(err);  // 调用回调函数error,传出错误
        } else {  // 否则
            throw err;  // 直接抛出错误
        }

    }



}





// Promise封装的ajax  => 调用此方法默认返回pending状态的Promise实例, 等ajax请求有结果之后,再改变状态
function ajaxPromise(options) { // {url, data, async = true, dataType = "text", success}
    let { type = "get", url, data, async = true, dataType = "text" } = options;
    return new Promise(function (resolve, reject) {
        try { // 捕获同步任务
            var xhr = new XMLHttpRequest();

            if (typeof data == "object") {  // 传入的数据是对象类型(条件不准确->后期补充)

                var list = [];
                for (var key in data) {
                    var val = data[key];
                    list.push(key + "=" + val)
                }
                data = list.join("&");
            }

            if (type.toLowerCase() == "get") { // GET get Get
                xhr.open("get", data ? url + "?" + data : url, async);
                xhr.send();
            } else if (type.toLowerCase() == "post") { // POST post Post
                xhr.open("post", url, async);

                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xhr.send(data);
            }


            xhr.onreadystatechange = function () {
                try {  // xhr.readyState改变后  => onreadystatechange事件中的错误
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        var result = xhr.responseText;

                        // 数据处理
                        if (dataType == "json") {
                            result = JSON.parse(result);
                        }
                        // console.log(result);

                        // 拿到数据之后的可能操作
                        // 列表数据 =>  动态生成(成绩表 商品列表)
                        // 数据增删改  => 增删改成功/失败


                        resolve(result); // 请求成功 Promise实例转为fulfilled状态,将请求的结果作为Promise实例的数据存储

                    }
                } catch (err) {
                    // // 是否存在回调函数error
                    reject(err);  // 请求中出现错误, Promise实例变为rejected(已失败状态), 将失败的原因(err对象)作为Promise实例的数据存储
                }
            }
        } catch (err) {

            reject(err);  // 请求中出现错误, Promise实例变为rejected(已失败状态), 将失败的原因(err对象)作为Promise实例的数据存储

        }



    })


}

export { ajax, ajaxPromise }